//Given an array of integers nums, sort the array in increasing order based on 
//the frequency of the values. If multiple values have the same frequency, sort 
//them in decreasing order. 
//
// Return the sorted array. 
//
// 
// Example 1: 
//
// 
//Input: nums = [1,1,2,2,2,3]
//Output: [3,1,1,2,2,2]
//Explanation: '3' has a frequency of 1, '1' has a frequency of 2, and '2' has 
//a frequency of 3.
// 
//
// Example 2: 
//
// 
//Input: nums = [2,3,1,3,2]
//Output: [1,3,3,2,2]
//Explanation: '2' and '3' both have a frequency of 2, so they are sorted in 
//decreasing order.
// 
//
// Example 3: 
//
// 
//Input: nums = [-1,1,-6,4,5,-6,1,4,1]
//Output: [5,-1,4,4,-6,-6,1,1,1] 
//
// 
// Constraints: 
//
// 
// 1 <= nums.length <= 100 
// -100 <= nums[i] <= 100 
// 
//
// Related Topics 数组 哈希表 排序 👍 92 👎 0

package editor.cn;

import java.util.*;
import java.util.stream.Collectors;

// Java: Sort Array by Increasing Frequency
public class SortArrayByIncreasingFrequency{
    public static void main(String[] args){
        Solution solution = new SortArrayByIncreasingFrequency().new Solution();
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int[] frequencySort(int[] nums) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int num : nums) {
            Integer value = map.getOrDefault(num, 0);
            map.put(num, value + 1);
        }
        System.out.println(map.toString());
        Set<Map.Entry<Integer, Integer>> entries = map.entrySet();
        System.out.println(entries.toString());
        List<Map.Entry<Integer, Integer>> sorted = entries.stream().sorted((e1,e2) -> e1.getValue() == e2.getValue() ? e2.getKey() - e1.getKey() : e1.getValue() - e2.getValue())
        .collect(Collectors.toList());
        System.out.println(sorted.toString());
        int[] result = new int[nums.length];
        int idx = 0;
        for (Map.Entry<Integer, Integer> entry : sorted) {
            for (int i = 0; i < entry.getValue(); i++) {
                System.out.println(entry.toString());
                result[idx++] = entry.getKey();
            }
        }
        return result;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}